import cv2
import numpy as np
import matplotlib.pyplot as plt

def _create_binary_image():
    """
    创建一个简单的二值图像，包含一个白色方块和一些白色噪声点。
    """
    # 使用 NumPy 创建一个 10x10 的黑色图像 (0代表黑色/背景)
    image = np.zeros((10, 10), dtype=np.uint8)

    # 在图像中心创建一个白色方块 (255代表白色/前景)
    image[2:8, 2:8] = 255
    
    # 添加一些小的白色噪声点，这些点在腐蚀后会被移除
    image[0, 0] = 255
    image[9, 9] = 255
    image[4, 0] = 255 # 一个靠边的点，可能会被腐蚀掉一部分

    print("原始图像（二值化）：")
    print(image)
    return image

def _create_gray_image():
    """
    创建一个简单的灰度图像，包含一个灰度方块和一些不同灰度的噪声点。
    """
    # 使用 NumPy 创建一个 10x10 的黑色图像 (0代表黑色/背景)
    image = np.zeros((10, 10), dtype=np.uint8)

    # 在图像中心创建一个灰度方块，值设为 128
    image[2:8, 2:8] = 128
    
    # 添加一些不同灰度的噪声点
    image[0, 0] = 200
    image[9, 9] = 150
    image[4, 0] = 220

    print("原始图像（灰度）：")
    print(image)
    return image
def _create_kernel():
    """
    定义一个 3x3 的矩形结构元素。
    """
    #kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 矩形核
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) # 十字形核
    print("\n使用的结构元素 (3x3 矩形):")
    print(kernel)
    return kernel

def _perform_erosion(image, kernel):
    """
    执行形态学腐蚀操作。
    """
    eroded_image = cv2.erode(image, kernel, iterations=1)
    print("\n腐蚀后的图像：")
    print(eroded_image)
    return eroded_image

def _visualize_results(image, eroded_image, kernel):
    """
    可视化原始图像、腐蚀后的图像和结构元素。
    """
    fig, axes = plt.subplots(1, 3, figsize=(12, 4))
    axes[0].imshow(image, cmap='gray', vmin=0, vmax=255)
    axes[0].set_title('Original Image')
    axes[0].axis('off')

    axes[2].imshow(kernel, cmap='gray', vmin=0, vmax=1)
    axes[2].set_title('Kernel Structuring')
    axes[2].axis('off')

    axes[1].imshow(eroded_image, cmap='gray', vmin=0, vmax=255)
    axes[1].set_title('Eroded Image')
    axes[1].axis('off')

    plt.tight_layout()
    plt.show()


if __name__ == "__main__":
    # STEP1：创建二值图像
    #image = _create_binary_image()
    image = _create_gray_image()

    # STEP2：创建kernel核
    kernel = _create_kernel()

    # STEP3：执行腐蚀操作
    eroded_image = _perform_erosion(image, kernel)

    # STEP4：可视化结果
    _visualize_results(image, eroded_image, kernel)